![Snowflakeデータ共有についてのまとめ](https://devio2023-media.developers.io/wp-content/uploads/2021/03/snowflake-logo-1200x630-1.png)
Snowflakeデータ共有についてのまとめ
データアナリティクス事業部のnkhrです。本ブログでは、SnowflakeのData Sharing機能についてまとめました。
Data Sharing機能とは、他のアカウントとDatabase内のオブジェクトを共有するための機能です。Snowflakeでは以下のDatabaseオブジェクトを共有できます。(2021/11時点)
- Tables
- External tables
- Secure views
- Secure materialized views
- Secure UDFs
Data Sharing機能の特徴
Data Sharing機能の特徴は以下の通りです。
- 共有されるデータベースはRead-Onlyであり、共有先<Consumer>でデータの修正や削除、追加はできない
- 共有の操作においてデータコピーや転送は発生しない(データ実体は共有元<Provider>アカウントにあり、データ共有先<Comsumer>アカウントのストレージを消費しない)
- 共有データベースに対するクエリ実行のCredit消費は、クエリ実行したウェアハウスがあるアカウントで課金される
- 別Regionや別Cloud Platformと共有を行う場合は、Data Replicationを実施したうえで共有する
- Business Criticalアカウントから別アカウントに共有する場合は「SHARE_RESTRICTIONS」パラメータを無効にする必要がある( 参考リンク
)
- SnowflakeではBusiness CriticalからNo Business Criticalに共有する場合は、直接ではなくProvider側でNo Business Criticalアカウントを作成し、No Business Critical同士で共有することを推奨
共有のイメージは下図のようになります。
※2021/11/24に図を差し替え(共有したDBをCloneするという記載をCopyに修正。2021/11現在、共有したDBのCloneは実施できません)
Shareオブジェクトは、共有するオブジェクトの権限と、共有先アカウント<Consumer>を管理します。Consumer側で、共有されたShareオブジェクトからデータベースを作成します。
CREATE DATABASE <任意の名前> FROM SHARE <Provider ACCOUNT ID>.<共有オブジェクト名>;
- データベースを作成すると権限が付与されているSchemaやTable、Viewが表示されます
センシティブデータ共有(構成例)
公式サイトのサンプルコードをベースに、センシティブなデータの共有構成例について整理しました。サンプルコードに記載されているオブジェクトの関係は以下の通りです。
この構成のポイントは以下の通りです。
- SchemaをPrivateとPublicにわけ、Public側のSchemaのみUSAGE権限を共有することで、Private Schemaの情報が誤って共有されることを防ぎます
- Viewで別のSchemaのテーブルを参照したとしても、ViewのSELECT権限を付与するだけで共有できます。(Viewが内部で参照しているテーブルのSELECT権限を渡す必要はないです)
- この構成では対象としていませんが、異なるDatabaseのTableやViewを参照している場合は、異なるDatabaseに対するREFERENCE_USAGE権限付与が必要です(この場合も参照先TableやSchemaの権限を共有する必要はないです)
共有までの流れ
共有を行う場合は、各アカウントで以下の作業を行います。
- Provider Account (データ共有元)
- 共有するSecure Viewやテーブル、UDFなどを作成
- (オプション) 行の表示制御をsharing_accessテーブルで行う場合は、sharing_accessテーブルにアカウントID(大文字アルファベット)とアカウントが参照できるキー値を設定(サンプルではaccess_idの'STOCK_GROUP_2')
- Shareオブジェクトを作成
- ShareオブジェクトにUSAGE(Database, Schema)権限とSELECT権限を付与
- Shareオブジェクトに共有先アカウントを紐づけ(ADD)
- 共有元アカウントIDをConsumer側に連絡
- Consumer Account(データ共有先)
- 共有先のアカウントIDをProvider側に連絡
- 共有されたShareオブジェクトを確認
- 共有元アカウントIDとShareオブジェクトからDatabaseを作成
おわりに
データ共有はSnowflakeでの注目機能の一つです。Data Sharingによりデータ実体は1つのまま、データを共有できるため、SSOT (Single Source of Truth)の実現にも有効な機能だと思います。
データビジネスでの利用だけでなく、自社内のアカウント間(部門アカウントや環境別アカウントなど)でのデータ共有においても使える機能ではないでしょうか。
以上、DA事業部のnkhr (@ttn_nkhr)でした。